home *** CD-ROM | disk | FTP | other *** search
Wrap
# Source Generated with Decompyle++ # File: in.pyo (Python 2.5) from socket import * from socket import _fileobject import socket as _socket import struct import time _socket.setdefaulttimeout(20) try: _GLOBAL_DEFAULT_TIMEOUT = _socket._GLOBAL_DEFAULT_TIMEOUT except AttributeError: pass from errno import EALREADY, EINPROGRESS, EWOULDBLOCK import logging log = logging.getLogger('socks') PROXY_TYPE_SOCKS4 = 1 PROXY_TYPE_SOCKS5 = 2 PROXY_TYPE_HTTP = 3 PROXY_TYPE_HTTPS = 4 _defaultproxy = None _orgsocket = _socket.socket class ProxyError(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) def __repr__(self): return '%s(%r)' % (type(self).__name__, repr(self.value)) class GeneralProxyError(ProxyError): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) class Socks5AuthError(ProxyError): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) class Socks5Error(ProxyError): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) class Socks4Error(ProxyError): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) class HTTPError(ProxyError): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) _generalerrors = ('success', 'invalid data', 'not connected', 'not available', 'bad proxy type', 'bad input') _socks5errors = ('succeeded', 'general SOCKS server failure', 'connection not allowed by ruleset', 'Network unreachable', 'Host unreachable', 'Connection refused', 'TTL expired', 'Command not supported', 'Address type not supported', 'Unknown error') _socks5autherrors = ('succeeded', 'authentication is required', 'all offered authentication methods were rejected', 'unknown username or invalid password', 'unknown error') _socks4errors = ('request granted', 'request rejected or failed', 'request rejected because SOCKS server cannot connect to identd on the client', 'request rejected because the client program and identd report different user-ids', 'unknown error') def setdefaultproxy(proxytype = None, addr = None, port = None, rdns = True, username = None, password = None): global _defaultproxy _defaultproxy = (proxytype, addr, port, rdns, username, password) class socksocket(_orgsocket): def __init__(self, family = _socket.AF_INET, type = _socket.SOCK_STREAM, proto = 0, _sock = None): _orgsocket.__init__(self, family, type, proto, _sock) if _defaultproxy != None: self._socksocket__proxy = _defaultproxy else: self._socksocket__proxy = (None, None, None, None, None, None) self._socksocket__proxysockname = None self._socksocket__proxypeername = None def __recvall(self, bytes): data = '' while len(data) < bytes: data = data + self.recv(bytes - len(data)) time.sleep(0.001) return data def setproxy(self, proxytype = None, addr = None, port = None, rdns = True, username = None, password = None): self._socksocket__proxy = (proxytype, addr, port, rdns, username, password) def __negotiatesocks5(self, destaddr, destport): if self._socksocket__proxy[4] != None and self._socksocket__proxy[5] != None: self.sendall('\x05\x02\x00\x02') else: self.sendall('\x05\x01\x00') chosenauth = self._socksocket__recvall(2) if chosenauth[0] != '\x05': self.close() raise GeneralProxyError((1, _generalerrors[1])) if chosenauth[1] == '\x00': pass elif chosenauth[1] == '\x02': self.sendall('\x01' + chr(len(self._socksocket__proxy[4])) + self._socksocket__proxy[4] + chr(len(self._socksocket__proxy[5])) + self._socksocket__proxy[5]) authstat = self._socksocket__recvall(2) if authstat[0] != '\x01': self.close() raise GeneralProxyError((1, _generalerrors[1])) if authstat[1] != '\x00': self.close() raise Socks5AuthError((3, _socks5autherrors[3])) else: self.close() if chosenauth[1] == '\xff': raise Socks5AuthError((2, _socks5autherrors[2])) else: raise GeneralProxyError((1, _generalerrors[1])) req = '\x05\x01\x00' try: ipaddr = _socket.inet_aton(destaddr) req = req + '\x01' + ipaddr except _socket.error: if self._socksocket__proxy[3] == True: ipaddr = None req = req + '\x03' + chr(len(destaddr)) + destaddr else: ipaddr = _socket.inet_aton(_socket.gethostbyname(destaddr)) req = req + '\x01' + ipaddr except: self._socksocket__proxy[3] == True req = req + struct.pack('>H', destport) self.sendall(req) resp = self._socksocket__recvall(4) if resp[0] != '\x05': self.close() raise GeneralProxyError((1, _generalerrors[1])) elif resp[1] != '\x00': self.close() if ord(resp[1]) <= 8: raise Socks5Error(ord(resp[1]), _generalerrors[ord(resp[1])]) else: raise Socks5Error(9, _generalerrors[9]) elif resp[3] == '\x01': boundaddr = self._socksocket__recvall(4) elif resp[3] == '\x03': resp = resp + self.recv(1) boundaddr = self._socksocket__recvall(resp[4]) else: self.close() raise GeneralProxyError((1, _generalerrors[1])) boundport = struct.unpack('>H', self._socksocket__recvall(2))[0] self._socksocket__proxysockname = (boundaddr, boundport) if ipaddr != None: self._socksocket__proxypeername = (_socket.inet_ntoa(ipaddr), destport) else: self._socksocket__proxypeername = (destaddr, destport) def getproxysockname(self): return self._socksocket__proxysockname def getproxypeername(self): return _orgsocket.getpeername(self) def getpeername(self): return self._socksocket__proxypeername def __negotiatesocks4(self, destaddr, destport): rmtrslv = False try: ipaddr = _socket.inet_aton(destaddr) except _socket.error: if self._socksocket__proxy[3] == True: ipaddr = '\x00\x00\x00\x01' rmtrslv = True else: ipaddr = _socket.inet_aton(_socket.gethostbyname(destaddr)) except: self._socksocket__proxy[3] == True req = '\x04\x01' + struct.pack('>H', destport) + ipaddr if self._socksocket__proxy[4] != None: req = req + self._socksocket__proxy[4] req = req + '\x00' if rmtrslv == True: req = req + destaddr + '\x00' self.sendall(req) resp = self._socksocket__recvall(8) if resp[0] != '\x00': self.close() raise GeneralProxyError((1, _generalerrors[1])) if resp[1] != 'Z': self.close() if ord(resp[1]) in (91, 92, 93): self.close() raise Socks4Error((ord(resp[1]), _socks4errors[ord(resp[1]) - 90])) else: raise Socks4Error((94, _socks4errors[4])) self._socksocket__proxysockname = (_socket.inet_ntoa(resp[4:]), struct.unpack('>H', resp[2:4])[0]) if rmtrslv != None: self._socksocket__proxypeername = (_socket.inet_ntoa(ipaddr), destport) else: self._socksocket__proxypeername = (destaddr, destport) def __negotiatehttps(self, destaddr, destport): try: self._sock = _socket.ssl(self._sock) self._socksocket__negotiatehttp(destaddr, destport) except Exception: e = None raise _socket.error(e) def __negotiatehttp(self, destaddr, destport): if self._socksocket__proxy[3] == False: addr = _socket.gethostbyname(destaddr) else: addr = destaddr self.sendall('CONNECT ' + addr + ':' + str(destport) + ' HTTP/1.1\r\n' + 'Host: ' + destaddr + '\r\n' + self._socksocket__httpauthstring() + '\r\n') last = resp = self.recv(1) while len(resp) < 32768 and last and resp.find('\r\n\r\n') == -1: last = self.recv(1) resp = resp + last if not last or len(resp) >= 32768: raise GeneralProxyError((1, _generalerrors[1], 'no response or response too large: %r' % resp)) statusline = resp.splitlines()[0].split(' ', 2) if statusline[0] not in ('HTTP/1.0', 'HTTP/1.1'): self.close() raise GeneralProxyError((1, _generalerrors[1], 'unknown statusline %r' % statusline)) try: statuscode = int(statusline[1]) except ValueError: self.close() raise GeneralProxyError((1, _generalerrors[1], 'unknown status code in: %r' % statusline)) if statuscode != 200: self.close() raise HTTPError((statuscode, statusline[2], 'non-200 status code: %r' % statuscode)) self._socksocket__proxysockname = ('0.0.0.0', 0) self._socksocket__proxypeername = (addr, destport) def __httpauthstring(self): (proxytype, addr, port, rdns, username, password) = self._socksocket__proxy if all((username, password)): raw = '%s:%s' % (username, password) auth = 'Basic %s' % ''.join(raw.encode('base-64').strip().split()) return 'Proxy-Authorization: %s\r\n' % auth else: return '' def connect(self, destpair): return self._connect(destpair, _orgsocket.connect) def _connect(self, destpair, connector): E = None return_val = None try: destpair = self.check_destpair(destpair) stuff = { PROXY_TYPE_SOCKS5: (1080, self._socksocket__negotiatesocks5), PROXY_TYPE_SOCKS4: (1080, self._socksocket__negotiatesocks4), PROXY_TYPE_HTTP: (8080, self._socksocket__negotiatehttp), PROXY_TYPE_HTTPS: (8080, self._socksocket__negotiatehttps) } if self._socksocket__proxy[0] in stuff: (def_port, negotiate) = stuff[self._socksocket__proxy[0]] if self._socksocket__proxy[2] != None: portnum = self._socksocket__proxy[2] else: portnum = def_port try: return_val = connector(self, (self._socksocket__proxy[1], portnum)) except _socket.error: e = None if e.args and e.args[0] not in (EINPROGRESS, EALREADY, EWOULDBLOCK): raise e except: e.args[0] not in (EINPROGRESS, EALREADY, EWOULDBLOCK) log.debug('negotiating proxy for destpair %r: %r, password=%s', destpair, self._socksocket__proxy[:-1], bool(self._socksocket__proxy[-1])) negotiate(destpair[0], destpair[1]) elif self._socksocket__proxy[0] == None: log.debug('No proxy settings. connecting destpair %r', destpair) return_val = connector(self, (destpair[0], destpair[1])) else: raise GeneralProxyError((4, _generalerrors[4])) except _socket.error: e = None E = e raise e except Exception: e = None E = e raise _socket.error(e) finally: if E is not None: if E.args and E.args[0] not in (EINPROGRESS, EALREADY, EWOULDBLOCK): log.debug('Error connecting to %r. self.__proxy is %r. Exception was %r', destpair, self._socksocket__proxy[:4], E) return return_val def check_destpair(self, destpair): if isinstance(destpair[0], basestring): try: destpair = (str(destpair[0]), destpair[1]) except ValueError: raise _socket.gaierror("Couldn't coerce %r to str. Invalid hostname." % destpair[0]) except: None<EXCEPTION MATCH>ValueError None<EXCEPTION MATCH>ValueError if (list, tuple) in (list, tuple): pass elif (list, tuple) == False and len(destpair) < 2 and type(destpair[0]) != str or type(destpair[1]) != int: raise GeneralProxyError((5, _generalerrors[5])) return destpair SocketType = socksocket